package com.zkingsoft.redis;

import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.google.gson.Gson;
import com.matrix.core.exception.GlobleException;
import com.matrix.core.tools.CookiesUtil;
import com.matrix.core.tools.LogUtil;
import com.matrix.core.tools.StringUtils;
import com.matrix.core.tools.UUIDUtil;
import com.matrix.core.tools.WebUtil;
import com.zkingsoft.common.constance.AppMessageCode;
import com.zkingsoft.common.redis.RedisClient;
import com.zkingsoft.laqeelin.bean.BizUser;

/**
 * 用户登录信息保存在redis上
 * 
 * @author JIANGYOUYAO
 * @email 935090232@qq.com
 * @date 2018年1月19日
 */
@Component
public class RedisUserLoginUtils {

	@Autowired
	RedisClient redisClient;
	private static final String TOKEN = "token";

	@Value("${debug}")
	private String isDebug;

	@Value("${token.domain}")
	String tokenDomain;

	/**
	 * 判断用户是否已经登录过
	 * 
	 * @author JIANGYOUYAO
	 * @email 935090232@qq.com
	 * @date 2018年1月19日
	 * @param token
	 *            会从http请求投中获取token进行验证
	 * @return
	 * 
	 */
	public boolean isUserLogin() {
		String token = getUserToken();

		if (StringUtils.isNotBlank(token)) {
			String user = redisClient.getCachedValue(token);
			LogUtil.debug("redis 获取到token={},用户={}", token, user);
			return user != null;
		} else {
			LogUtil.debug("redis token未获取到token");
			return false;
		}
	}

	/**
	 * 在redis中保存用户信息，并且返回保存的token
	 * 
	 * @author JIANGYOUYAO
	 * @email 935090232@qq.com
	 * @date 2018年1月19日
	 * @param user
	 * @return 返回保存用户信息的token
	 */
	public String saveUserInfo(BizUser user) {
		String token = UUIDUtil.getRandomID();
		redisClient.saveValue(token, user);
		LogUtil.debug("redis 保存用户返回token={}", token);
		return token;
	}

	/**
	 * 获取登录用户信息，如果 获取失败将会抛出异常
	 * 
	 * @author JIANGYOUYAO
	 * @email 935090232@qq.com
	 * @date 2018年1月19日
	 * @return
	 */
	public BizUser getLoginUser() {
		String token = getUserToken();
		LogUtil.debug("redis获取到token={}", token);
		if (token != null) {
			String json = redisClient.getCachedValue(token);
			Gson g = new Gson();
			return g.fromJson(json, BizUser.class);
		} else {
			throw new GlobleException(AppMessageCode.User.LOGIN_TIMEOUT);
		}
	}

	public String getUserToken() {
		String token = WebUtil.getRequest().getHeader("token");
		// debug模式可以从url参数中获取token
		if ("true".equals(isDebug)) {
			if (token == null) {
				token = WebUtil.getRequest().getParameter("token");
			}
		}
		return token;
	}

	/**
	 * 用户退出
	 * 
	 * @author:吕敬瑛
	 * @date:2018年1月19日下午3:17:14
	 */
	public void loginOut(HttpServletResponse response) {
		String toke = getUserToken();
		redisClient.removeObject(toke);
		CookiesUtil.setCookie(response, TOKEN, "", 0, tokenDomain);
	}

}
